package com.ccc.util;

import java.util.*;

/*
     输入的工具
        自己去读懂(读别人写的代码--看源码)
 */
public class CMUtility {
    private static Scanner scanner = new Scanner(System.in);

    /*
        读取菜单选项--肯定是12345字符中的一种
     */
    public static char readMenuSelection() {
        char c;
        for (; ; ) {
            //读取长度为1，并且不接收空串！必须是1
            String str = readKeyBoard(1, false);
            c = str.charAt(0);//将str中第一个字符取出，赋值给c
            if (c != '1' && c != '2' &&
                    c != '3' && c != '4' && c != '5') {
                System.out.print("选择错误，请重新输入：");
            } else
                break;
        }
        return c;
    }

    /*
        读取一个字符
     */
    public static char readChar() {
        String str = readKeyBoard(1, false);
        return str.charAt(0);
    }

    /*
        读取一个字符，但是如果没有输入，返回默认值
     */
    public static char readChar(char defaultValue) {
        //读取字符串，长度最长为1，但是允许接收空串
        String str = readKeyBoard(1, true);
        return (str.length() == 0) ? defaultValue : str.charAt(0);
    }

    /*
        读取一个整型数据，长度最长为2(1-99)
     */
    public static int readInt() {
        int n;
        for (; ; ) {
            //读取字符串长度为2，不允许接收空串   abc-->转不成int值
            String str = readKeyBoard(2, false);
            try {
                n = Integer.parseInt(str);//将str转为int值
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误，请重新输入：");
            }
        }
        return n;
    }

    /*
       读取int值，如果没有输入，则返回默认值
     */
    public static int readInt(int defaultValue) {
        int n;
        for (; ; ) {
            String str = readKeyBoard(2, true);
            if (str.equals("")) {
                return defaultValue;
            }

            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误，请重新输入：");
            }
        }
        return n;
    }

    /*
        读取一个字符串，长度用户指定

     */
    public static String readString(int limit) {
        return readKeyBoard(limit, false);
    }

    /*
        读取字符串，如果么有输入，返回默认值
     */
    public static String readString(int limit, String defaultValue) {
        String str = readKeyBoard(limit, true);
        return str.equals("") ? defaultValue : str;
    }

    /*
        读取Y或N!  如果输入其他字符，会让你继续输入
    */
    public static char readConfirmSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1, false).toUpperCase();
            c = str.charAt(0);
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.print("选择错误，请重新输入：");
            }
        }
        return c;
    }

    /**
     * 功能：手动输入一个字符串，可以设置最大长度，以及是否接收空串
     *
     * @param limit       int  返回字符串的最大长度  10
     * @param blankReturn boolean   是否允许返回空串  true-允许，false-不允许
     * @return String
     */
    public static String readKeyBoard(int limit, boolean blankReturn) {
        String line = "";//line初始化为空串

        while (true) {// true和 scanner.hasNextLine()是一样的  修改客户信息
            line = scanner.nextLine();//读取一行  返回一个字符串，赋值给line
            if (line.length() == 0) {//判断读到的这一行是否有字符
                if (blankReturn)
                    return line;//line就是一个""   空串
                else
                    continue;
            }

            if (line.length() < 1 || line.length() > limit) {
                System.out.print("输入长度（不大于" + limit + "）错误，请重新输入：");
                continue;
            }
            break;
        }

        return line;
    }
}
